Author: Kareem Hamoudeh

  1. Look at the chapter on interactive graphics and, specifically, the code to display a subject's MRICloud data as a sunburst plot. Do the following. Display this subject's data as a Sankey diagram. Display as many levels as you can (at least 3) for Type = 1, starting from the intracranial volume. Put this in a file called hw4.ipynb.
In [1]:
import pandas as pd
import plotly.express as px
import numpy as np
In [2]:
dat = pd.read_csv("assetts/kirby21.csv").drop(['Unnamed: 0'], axis = 1)
dat = dat.assign(id_char = dat.id.astype(str))
icv = dat.groupby(['id']).volume.sum().reset_index().rename(columns = {'volume' : 'icv'})
dat = pd.merge(dat, icv, on = 'id')
dat = dat.assign(comp = dat.volume / dat.icv)
## load in the hierarchy information
url = "https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt"
multilevel_lookup = pd.read_csv(url, sep = "\t").drop(['Level5'], axis = 1)
multilevel_lookup = multilevel_lookup.rename(columns = {
    "modify"   : "roi", 
    "modify.1" : "level4",
    "modify.2" : "level3", 
    "modify.3" : "level2",
    "modify.4" : "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
## Now load in the subject data
id = 127
subjectData = pd.read_csv("assetts/kirby21AllLevels.csv")
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]
## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on = "roi")
subjectData = subjectData.assign(icv = "ICV")
subjectData = subjectData.assign(comp = subjectData.volume / np.sum(subjectData.volume))

Sankey Plot¶

1) Make tables for connections. ICV-> 1, 1->2, 2>3 etc... 2) Label list 3) for loop for each pair (ICV - CSF/Diencephelon... | Level1 - CSF/Die...) 4) populate source/target/value with numbers corresponding to the indices of list of labels

labels = brain structures

value = composition

source = for level0-1: ICV| level1-2: level1 | Level2-3: level2| level3-4

target =

In [3]:
# Grouping level 0 (icv) and level 1
icv_one = subjectData.groupby(['icv', 'level1']).sum().reset_index().drop('volume', axis = 1)
one_two = subjectData.groupby(['level1', 'level2']).sum().reset_index().drop('volume', axis = 1)
two_three = subjectData.groupby(['level2', 'level3']).sum().reset_index().drop('volume', axis = 1)
three_four = subjectData.groupby(['level3', 'level4']).sum().reset_index().drop('volume', axis = 1)
In [4]:
import plotly.graph_objects as go


labels = ['ICV']
for i in icv_one['level1']:
    labels.append(i)
for i in one_two['level2']:
    labels.append(i)
for i in two_three['level3']:
    labels.append(i)
for i in three_four['level4']:
    labels.append(i)


value = []

for i in icv_one['comp']:
    value.append(i)
for i in one_two['comp']:
    value.append(i)
for i in two_three['comp']:
    value.append(i)
for i in three_four['comp']:
    value.append(i)

Sankey of level0(icv) to level1¶

In [5]:
# Trying to make a for loop to append source and target lists 
index_list = []
for i in range(226):
    index_list.append(i)
sourcetest = []
for i in icv_one['icv']:
    level1_index = labels.index(i)
    sourcetest.append(index_list[level1_index])

for i in one_two['level1']:
    level1_index = labels.index(i)
    sourcetest.append(index_list[level1_index])

# for i in two_three['level2']:
#     level1_index = labels.index(i)
#     sourcetest.append(index_list[level1_index])

# for i in three_four['level3']:
#     level1_index = labels.index(i)
#     sourcetest.append(index_list[level1_index])

targettest = []
for i in icv_one['level1']:
    level2_index = labels.index(i)
    targettest.append(index_list[level2_index])

for i in one_two['level2']:
    level2_index = labels.index(i)
    targettest.append(index_list[level2_index])

# for i in two_three['level3']:
#     level2_index = labels.index(i)
#     targettest.append(index_list[level2_index])

# for i in three_four['level4']:
#     level2_index = labels.index(i)
#     targettest.append(index_list[level2_index])

Displaying for 3 levels¶

**ICV -> level1 -> level2

In [6]:
# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=15, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()
In [7]:
for i in two_three['level2']:
    level1_index = labels.index(i)
    sourcetest.append(index_list[level1_index])



for i in two_three['level3']:
    level2_index = labels.index(i)
    targettest.append(index_list[level2_index])


# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=2, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()
In [8]:
for i in three_four['level3']:
    level1_index = labels.index(i)
    sourcetest.append(index_list[level1_index])

for i in three_four['level4']:
    level2_index = labels.index(i)
    targettest.append(index_list[level2_index])

# data to dict, dict to sankey
link = dict(source = sourcetest, target = targettest, value = value)
node = dict(label = labels, pad=2, thickness=5)
data = go.Sankey(link = link, node=node)
# plot
fig = go.Figure(data)
fig.show()
In [ ]:
 
In [ ]: